define([ "jquery", "backbone", "db", "common" ], function( $, Backbone, Db, Common ) {

    var storage = Db.getStorage();
    
    if (storage.get('auto') === null) {
        storage.set('auto', []);
    }
    
    if (storage.get('ustawienia') === null) {
        storage.set('ustawienia', {});
    }

//	/**
//	* inicjalizacja bazy danych
//	* ----------------------------------------
//	*/
//	db = Db.get();
//	db.transaction(function(tx) {
//		
//		//tx.executeSql('DROP TABLE IF EXISTS "auto"');
//		//tx.executeSql('DROP TABLE IF EXISTS "tankowanie"');
//		//tx.executeSql('DROP TABLE IF EXISTS "ustawienia"');
//	
//		tx.executeSql('CREATE TABLE IF NOT EXISTS "auto" ("id" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL , "nazwa" VARCHAR, "opis" VARCHAR, "aktywny" BOOL DEFAULT 0)');
//		tx.executeSql('CREATE TABLE IF NOT EXISTS "tankowanie" ("id" INTEGER PRIMARY KEY AUTOINCREMENT  NOT NULL ,"data" DATETIME DEFAULT (CURRENT_TIMESTAMP) ,"przebieg" INTEGER,"ilosc" DECIMAL(6,2),"cena" DECIMAL(5,2), "spalanie" DECIMAL(6,2), "r" BOOL DEFAULT 0, "f" BOOL DEFAULT 0,"id_auto" INTEGER)');
//		tx.executeSql('CREATE INDEX IF NOT EXISTS tank_r ON tankowanie(r ASC)');
//		tx.executeSql('CREATE INDEX IF NOT EXISTS tank_f ON tankowanie(f ASC)');
//		tx.executeSql('CREATE INDEX IF NOT EXISTS tank_id_auto ON tankowanie(id_auto ASC)');
//		tx.executeSql('CREATE INDEX IF NOT EXISTS auto_aktywne ON auto(aktywny ASC)');
//		
//		//tx.executeSql('update tankowanie set spalanie = ""');
//		
//		tx.executeSql('CREATE TABLE IF NOT EXISTS "ustawienia" ("id" INTEGER PRIMARY KEY NOT NULL , "dlugosc" VARCHAR, "pojemnosc" VARCHAR, "waluta" VARCHAR)');
//		
//		// dodanie kolumny 
//		tx.executeSql('SELECT lang FROM "ustawienia" LIMIT 1', [], function () {
//			console.log("pole ustawienia.lang istnieje");
//		}, function () {
//			console.log("pole ustawienia.lang nieistnieje");
//			tx.executeSql('ALTER TABLE "ustawienia" ADD COLUMN "lang" VARCHAR')
//		});
//        
//        // dodoanie mail , pass
//        tx.executeSql('SELECT login FROM "ustawienia" LIMIT 1', [], function () {
//			console.log("pole ustawienia.login istnieje");
//		}, function () {
//			console.log("pole ustawienia.login nieistnieje");
//			tx.executeSql('ALTER TABLE "ustawienia" ADD COLUMN "login" VARCHAR');
//            tx.executeSql('ALTER TABLE "ustawienia" ADD COLUMN "pass" VARCHAR');
//		});
//        
//        // auto.synchro
//        tx.executeSql('SELECT synchro FROM "auto" LIMIT 1', [], function () {
//			console.log("pole auto.synchro istnieje");
//		}, function () {
//			console.log("pole auto.synchro nieistnieje");
//			tx.executeSql('ALTER TABLE "auto" ADD COLUMN "synchro" TINYINT DEFAULT 1');
//        });
//        
//        // ustawienia.keyboard (1- number , 2- normal)
//        tx.executeSql('SELECT keyboard FROM "ustawienia" LIMIT 1', [], function () {
//			console.log("pole ustawienia.keyboard istnieje");
//		}, function () {
//			console.log("pole ustawienia.keyboard nieistnieje");
//			tx.executeSql('ALTER TABLE "ustawienia" ADD COLUMN "keyboard" TINYINT DEFAULT 1');
//        });
//        
//		console.log("createIfNotExists finished");
//	});

	
	/**
	* ogolna definicja adaptera
	* -------------------------------------
	*/
	
	var Adapter = {
		find : function () {
			alert('methoda find nie jest zaimplementowana w wykorzystanym adapterze! ');
			console.log(this);
		},
		findAll : function () {
			alert('methoda findAll nie jest zaimplementowana w wykorzystanym adapterze! ');
			console.log(this);
		},
		create : function () {
			alert('methoda create nie jest zaimplementowana w wykorzystanym adapterze! ');
			console.log(this);
		},
		update : function () {
			alert('methoda update nie jest zaimplementowana w wykorzystanym adapterze! ');
			console.log(this);
		},
		destroy : function () {
			alert('methoda destroy nie jest zaimplementowana w wykorzystanym adapterze! ');
			console.log(this);
		}
	};
	
	var AutoAdapter = {};
	_.extend(AutoAdapter, Adapter);
	_.extend(AutoAdapter, {
		
		create : function (model,success,error) {
			var json = model.toJSON();
			var aktywny = 0;
			if (typeof json.aktywny !== "undefined") {
				aktywny = json.aktywny;
			}
            
            var autoColl = this.storage.get('auto');
            
            json.id = 1;
            if (autoColl.length > 0) {
                json.id = _.max(autoColl, function(one){ return one.id; }).id + 1;
            }   
            
            autoColl.push(json);
            this.storage.set('auto', autoColl);
            success(json);
        },
		
		destroy : function (model, success, error) {
			var json = model.toJSON();
            
            var id = json.id;
            var autoColl = this.storage.get('auto');
            
            for(var i in autoColl) {
                if (autoColl[i]['id'] == id) {
                    delete autoColl[i];
                    break;
                }
            }
            
            this.storage.set('auto',autoColl);
            success();
		},
		
		find : function (model, success, error) {
			var json = model.toJSON();
            
            var id = json.id;
            var autoColl = this.storage.get('auto');
            var obj = {};
            for(var i in autoColl) {
                if (autoColl[i]['id'] == id) {
                    obj = autoColl[i];
                    break;
                }
            }

            success(obj);
		},
		
		findAll : function (model, success, error, options) {
            var autoColl = this.storage.get('auto');

            success(autoColl);
            
//			var sql = "SELECT * FROM auto";
//			if(typeof options.where === 'object') {
//				sql += " WHERE "+Common.getWhereSql(options.where);
//			}
//			if(typeof options.sort === 'object') {
//				sql += " ORDER BY "+Common.getSortSql(options.sort);
//			}
//			this._executeSql(sql,null, success, error);			
		},
		
		update : function (model, success, error, options) {
			var json = model.toJSON();
			
            var id = json.id;
            var autoColl = this.storage.get('auto');
             
			if (json.aktywny == 1) {
                // wszystkie obiekty na aktywny = 0
                for(var i in autoColl) {
                    autoColl[i]['aktywny'] = 0;
                }
			}
            // potem aktualizacja tego obiektu
			for(var i in autoColl) {
                if (autoColl[i]['id'] == id) {
                    autoColl[i] = json;
                    break;
                }
            }
            this.storage.set('auto', autoColl);
            success(json);
		}
	});
	
	
	var TankowanieAdapter = {};
	_.extend(TankowanieAdapter, Adapter);
	_.extend(TankowanieAdapter, {
		create : function (model,success,error) {
			var json = model.toJSON();
			
            var autoColl = this.storage.get('auto');
            var autoId = json.id_auto;
            var auto;
            
            for(var i in autoColl) {
                if (autoColl[i]['id'] == autoId) {
                    auto = autoColl[i];
                    break;
                }
            }
            if (typeof auto === 'undefined') {
                success({});
                return;
            }
            if (typeof auto.tank === 'undefined') {
                auto.tank = [];
            }
            var tankColl = auto.tank;
            
            json.id = 1;
            if (tankColl.length > 0) {
                json.id = _.max(tankColl, function(one){ return one.id; }).id + 1;
            }   
            
            tankColl.push(json);
            this.storage.set('auto', autoColl);
            success(json);
        },
		
		destroy : function (model, success, error) {
			var json = model.toJSON();
            var id = json.id;
            
            var autoColl = this.storage.get('auto');
            var autoId = json.id_auto;
            var auto;
            
            for(var i in autoColl) {
                if (autoColl[i]['id'] == autoId) {
                    auto = autoColl[i];
                    break;
                }
            }
            if (typeof auto === 'undefined') {
                success({});
                return;
            }
            if (typeof auto.tank === 'undefined') {
                auto.tank = [];
            }
            var tankColl = auto.tank;
            
            for(var i in tankColl) {
                if (tankColl[i]['id'] == id) {
                    delete tankColl[i];
                    break;
                }
            }
            
            this.storage.set('auto',autoColl);
            success();
		},
		
		find : function (model, success, error) {
			var json = model.toJSON();
            var id = json.id;
            
            var autoColl = this.storage.get('auto');
            var autoId = json.id_auto;
            var auto;
            
            for(var i in autoColl) {
                if (autoColl[i]['id'] == autoId) {
                    auto = autoColl[i];
                    break;
                }
            }
            if (typeof auto === 'undefined') {
                success({});
                return;
            }
            if (typeof auto.tank === 'undefined') {
                auto.tank = [];
            }
            var tankColl = auto.tank;
            
            var tankObj = {};
            for(var i in tankColl) {
                if (tankColl[i]['id'] == id) {
                    tankObj = tankColl[i];
                    break;
                }
            }
            
            success(tankObj);
		},
		
		findAll : function (model, success, error, options) {
			
            var where = Common.getWhereJson((options.where));
             
            
            var autoId = where.id_auto;
            
            var autoColl = this.storage.get('auto');
            var auto;
            
            for(var i in autoColl) {
                if (autoColl[i]['id'] == autoId) {
                    auto = autoColl[i];
                    break;
                }
            }
            
            if (typeof auto === 'undefined') {
                success({});
                return;
            }
            
            if (typeof auto.tank === 'undefined') {
                auto.tank = [];
            }
            var tankColl = auto.tank;
            
            // sort
            if(typeof options.sort === 'object' && typeof options.sort.data !== 'undefined') {
                tankColl = _.sortBy(tankColl, function(tankObj) {
                    return tankObj.data;
                });
                tankColl = tankColl.reverse();
            }
            
            console.log(tankColl);
            
            success(tankColl);
            
//            if(typeof options.cols === 'object') {
//				var sql = "SELECT "+Common.getColsSql(options.cols)+" FROM tankowanie";
//			}
//			else {
//				var sql = "SELECT * FROM tankowanie";
//			}
//			if(typeof options.where === 'object') {
//				sql += " WHERE "+Common.getWhereSql(options.where);
//			}
//			if(typeof options.group === 'object') {
//				sql += " GROUP BY  "+Common.getGroupSql(options.group);
//			}
//			
//			if(typeof options.sort === 'object') {
//				sql += " ORDER BY "+Common.getSortSql(options.sort);
//			}
//			if(typeof options.limit === 'object') {
//				sql += " LIMIT "+Common.getLimitSql(options.limit);
//			}
//			this._executeSql(sql,null, success, error);			
		},
		
		update : function (model, success, error, options) {
			var json = model.toJSON();
            var id = json.id;
            
            var autoColl = this.storage.get('auto');
            var autoId = json.id_auto;
            var auto;
            
            for(var i in autoColl) {
                if (autoColl[i]['id'] == autoId) {
                    auto = autoColl[i];
                    break;
                }
            }
            
            if (typeof auto === 'undefined') {
                success({});
                return;
            }
            if (typeof auto.tank === 'undefined') {
                auto.tank = [];
            }
            var tankColl = auto.tank;
            for(var i in tankColl) {
                if (tankColl[i]['id'] == id) {
                    tankColl[i] = json;
                    break;
                }
            }
            
//            if (options.edit == true) {
//                // ustawienie nowszych tankowan (jezeli istnieja) na spalane = null, co spowoduje ponowne wyliczenie 
//                for(var i in tankColl) {
//                    if (i > id) {
//                        tankColl[i].spalanie = '';
//                    }
//                }
//                
//            }
            
            this.storage.set('auto', autoColl);
            success(json);
        }
	});

	var UstawieniaAdapter = {};
	_.extend(UstawieniaAdapter, Adapter);
	_.extend(UstawieniaAdapter, {
		
		create : function (model,success,error) {
			var json = model.toJSON();
            
            this.storage.set('ustawienia',json);
        },
		
		destroy : function (model, success, error) {
			var json = model.toJSON();

		},
		
		find : function (model, success, error) {
			
            var ustawienia = this.storage.get('ustawienia');
            success(ustawienia);
		},
		
		findAll : function (model, success, error, options) {
			
            var ustawienia = this.storage.get('ustawienia');
            success(ustawienia);			
		},
		
		update : function (model, success, error, options) {
			var json = model.toJSON();
            
			this.storage.set('ustawienia',json);
            success(json);            
		}
	});
	
	
	/**
	* implementacja metody do synchronizacji
	* --------------------------------------------
	*/
    Backbone.sync = function (method, model, options) {
		
		//console.log(method, model, options, "Backbone.sync");
		
		var className = '';
		if (typeof model.model !== 'undefined') {
			// collection
			var modelFromColl = new model.model;
			className = modelFromColl.className;
		}
		else{
			// model
			className = model.className;
		}
		
		var adapter;
		switch(className) {
			case 'auto' :
				adapter = AutoAdapter;
				break;
			case 'tankowanie' :
				adapter = TankowanieAdapter;
				break;
			case 'ustawienia' :
				adapter = UstawieniaAdapter;
				break;
			default : 
				alert("nie rozpoznany parametr className w modelu");
				console.log(model);
				options.error();
				return;
		}
		// ustawienie polaczenia
		adapter.storage = storage;
		adapter.debug = true;
		
		var error = function (tx,error) {
			console.error("sql error");
			console.error(error);
			console.error(tx);
			options.error(error);
		};
				
		switch (method) {
			case "read":
				if (model.id) {
					var success = function (res) {
						options.success(res,res,options);
					};
				
					adapter.find(model, success, error);
				} else {
					
					var success = function (resColl) {
						options.success(resColl,resColl,options);
					};
					
					adapter.findAll(model, success, error, options);
				}
				break;
			case "create":
				var success = function (res) {
					model.set('id',res.id);
					options.success(model, {}, options);
				}
				adapter.create(model, success, error);
				break;
			case "update":
				var success = function (res) {
					options.success(model,{}, options);
				}
				adapter.update(model, success, error, options);
				break;
			case "delete":
				var success = function () {
					options.success(model,{}, options);
				}
				adapter.destroy(model, success, error);
				break;
		}
		
	};

} );